//package com.cenntro.oss.controller;
//
//import java.util.Arrays;
//import java.util.Date;
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//
//import javax.annotation.Resource;
//
//import org.apache.commons.lang3.ArrayUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.util.Assert;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.CrossOrigin;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import com.alibaba.fastjson.JSON;
//import com.cenntro.common.base.BaseController;
//import com.cenntro.common.model.vo.PageVO;
//import com.cenntro.common.util.ConvertorUtils;
//import com.cenntro.common.util.result.PageResult;
//import com.cenntro.common.util.result.Result;
//import com.cenntro.oss.common.enums.StaticEnum;
//import com.cenntro.oss.mapper.DevBatteryMapper;
//import com.cenntro.oss.mapper.DevBatteryPackMapper;
//import com.cenntro.oss.model.dbo.AfterFaultDO;
//import com.cenntro.oss.model.dbo.AfterFaultPartsDO;
//import com.cenntro.oss.model.dbo.DevBatteryDO;
//import com.cenntro.oss.model.dbo.DevBatteryModuleDO;
//import com.cenntro.oss.model.dbo.DevBatteryPackDO;
//import com.cenntro.oss.model.dbo.DevBomPartpnRefDO;
//import com.cenntro.oss.model.dbo.DevCarDO;
//import com.cenntro.oss.model.dbo.DevCertificateDO;
//import com.cenntro.oss.model.dbo.DevDeviceOnlineDO;
//import com.cenntro.oss.model.dbo.DevDevicePartsDO;
//import com.cenntro.oss.model.dbo.DevDeviceStaticDO;
//import com.cenntro.oss.model.dbo.DevDrivingInfoDO;
//import com.cenntro.oss.model.dbo.DevOperateDO;
//import com.cenntro.oss.model.dbo.SysAgentDO;
//import com.cenntro.oss.model.qo.AddVehicleQO;
//import com.cenntro.oss.model.qo.DeviceListQO;
//import com.cenntro.oss.model.vo.AfterFaultPartsVO;
//import com.cenntro.oss.model.vo.AfterFaultVO;
//import com.cenntro.oss.model.vo.DevBatteryModuleVO;
//import com.cenntro.oss.model.vo.DevBatteryPackVO;
//import com.cenntro.oss.model.vo.DevBatteryVO;
//import com.cenntro.oss.model.vo.DevCertificateVO;
//import com.cenntro.oss.model.vo.DevDevicePartsVO;
//import com.cenntro.oss.model.vo.DevDrivingInfoVO;
//import com.cenntro.oss.model.vo.DeviceStaticVO;
//import com.cenntro.oss.model.vo.NewVehicleDetailVO;
//import com.cenntro.oss.model.vo.VehicleDetailVO;
//import com.cenntro.oss.model.vo.VehicleInsertVO;
//import com.cenntro.oss.model.vo.VehicleVO;
//import com.cenntro.oss.service.AfterFaultPartsService;
//import com.cenntro.oss.service.AfterFaultService;
//import com.cenntro.oss.service.DevBatteryModuleService;
//import com.cenntro.oss.service.DevBomCarService;
//import com.cenntro.oss.service.DevBomPartpnRefService;
//import com.cenntro.oss.service.DevCarService;
//import com.cenntro.oss.service.DevCertificateService;
//import com.cenntro.oss.service.DevDeviceOnlineService;
//import com.cenntro.oss.service.DevDevicePartsService;
//import com.cenntro.oss.service.DevDeviceStaticService;
//import com.cenntro.oss.service.DevDrivingInfoService;
//import com.cenntro.oss.service.DevOperateService;
//import com.cenntro.oss.service.SysAgentService;
//import com.cenntro.oss.valid.Valid;
//import com.github.pagehelper.Page;
//import com.github.pagehelper.PageHelper;
//import com.google.common.collect.ImmutableMap;
//import com.google.common.collect.Lists;
//import com.google.common.collect.Maps;
//
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiOperation;
//
//
//@Deprecated
//@Api(value = "车辆管理", tags = { "车辆管理" })
//@RestController
//@RequestMapping("/vehicle")
//public class VehicleController extends BaseController {
//    private Logger LOG = LoggerFactory.getLogger(VehicleController.class);
//
//    @Resource
//    private DevDeviceStaticService devDeviceStaticService;
//    @Resource
//    private DevDeviceOnlineService devDeviceOnlineService;
//
//    @Resource
//    private DevCarService devCarService;
//    @Resource
//    private SysAgentService sysAgentService;
//    @Resource
//    private DevOperateService devOperateService;
//
//    @Resource
//    private DevDevicePartsService devDevicePartsService;
//    
//    @Resource
//    private DevCertificateService devCertificateService;
//    
//    @Resource
//    private DevBatteryModuleService devBatteryModuleService;
//    
//    @Resource
//    private DevBomCarService devBomCarService;
//    
//    @Resource
//    private DevBomPartpnRefService devBomPartpnRefService;
//    
//    @Resource
//    private DevBatteryPackMapper devBatteryPackMapper;
//    
//    @Resource
//    private DevBatteryMapper devBatteryMapper;
//    @Resource
//    private AfterFaultPartsService afterFaultPartsService;
//    @Resource
//    private AfterFaultService afterFaultService;
//    @Resource
//    private DevDrivingInfoService devDrivingInfoService;
//    /**
//     * 车辆查询(老的 智慧车联)
//     * 
//     * @return
//     */
//    @CrossOrigin
//    @ApiOperation(value = "车辆查询", notes = "车辆管理")
//    @RequestMapping(value = "/selectPage")
//    public Result selectPage(VehicleVO vehicle) {
//        Page<DevDeviceStaticDO> page = PageHelper.startPage(vehicle.getPage(), vehicle.getLimit());
//        List<VehicleDetailVO> list = devDeviceStaticService.selectPage(vehicle);
//        return PageResult.ok(list, page.getTotal());
//    }
//    
//    /**
//     * 车辆查询
//     * 
//     * @return
//     */
//    @CrossOrigin
//    @ApiOperation(value = "序列号查询", notes = "车辆管理")
//    @RequestMapping(value = "/selectByDevSN")
//    public Result selectByDevSN(DeviceListQO qo) {
//        if(StringUtils.isBlank(qo.getDevSN())){
//            return Result.ok();
//        }
//        qo.setDevSNList(Arrays.asList(qo.getDevSN().split(",")));
//        List<VehicleDetailVO> list = devDeviceStaticService.selectListByUnAllot(qo);
//        return PageResult.ok(list, list.size());
//    }
//    
//    /**
//     * 车辆查询
//     * 
//     * @return
//     */
//    @CrossOrigin
//    @ApiOperation(value = "车辆未分配查询", notes = "车辆管理")
//    @RequestMapping(value = "/selectUnAllot")
//    public Result selectUnAllot(DeviceListQO qo, PageVO pageVO) {
//        qo.setState(1);
//        qo.setDevSNList(Arrays.asList(qo.getDevSN().split(",")));
//        Page<DevDeviceStaticDO> page = PageHelper.startPage(pageVO.getPage(), pageVO.getLimit());
//        List<VehicleDetailVO> list = devDeviceStaticService.selectListByUnAllot(qo);
//        
//        return PageResult.ok(list, page.getTotal());
//    }
//
//    /**
//     * 更加车架号 查询车辆最新详情
//     * 
//     * @return
//     */
//    @CrossOrigin
//    @ApiOperation(value = "查询车辆最新详情", notes = "车辆管理")
//    @RequestMapping(value = "/selectDetail")
//    public Result selectDetail(VehicleVO vehicle) {
//        Map<String, Object> map = Maps.newHashMap();
//        map.put("id", vehicle.getId());
//        map.put("carNub", vehicle.getCarNub());
//        DevDeviceStaticDO dsd = devDeviceStaticService.selectOne(map);
//        DevDeviceOnlineDO dod = null;
//        DevCarDO devcar = null;
//        SysAgentDO sysagent = null;
//        if (dsd != null) {
//            Map<String, Object> columnMap = Maps.newHashMap();
//            columnMap.put("devId", dsd.getDevId());
//            dod = devDeviceOnlineService.selectOne(columnMap);
//            devcar = devCarService.selectById(dsd.getCarId());
//            sysagent = sysAgentService.selectById(dsd.getAgentId());
//            List<VehicleDetailVO> list = devDeviceStaticService.translate(Lists.newArrayList(dsd), Lists.newArrayList(dod), com.google.common.collect.Lists.newArrayList(devcar),
//                    Lists.newArrayList(sysagent));
//            return PageResult.ok(list.get(0));
//        }
//        return PageResult.error("查询错误");
//    }
//
//    /**
//     * 车辆增加
//     * 
//     * @return
//     */
//    @CrossOrigin
//    @ApiOperation(value = "车辆新增", notes = "车辆管理")
//    @RequestMapping(value = "/insert")
//    public Result insert(@Validated VehicleInsertVO vehicle) {
//        DevCarDO carModel = devCarService.selectById(vehicle.getCarId());
//        Assert.isTrue(carModel != null, "车型不存在");
//        Assert.isTrue(carModel.getStatus() != -1, "该车型已经停用");
//        devDeviceStaticService.insert(vehicle);
//        return Result.ok();
//    }
//
//    /**
//     * 车辆分配客户  / 或者 过户
//     * 
//     * @return
//     */
//    @CrossOrigin
//    @ApiOperation(value = "车辆分配客户", notes = "车辆分配客户")
//    @RequestMapping(value = "/assign")
//    public Result assign(DeviceStaticVO deviceStaticVO) {
//        if (deviceStaticVO.getAgentId() == null){
//            return Result.error("客户id是空");
//        }
//        if (StringUtils.isBlank(deviceStaticVO.getDevSNList())){
//            return Result.error("序列号不能是空！");
//        }
//        
//        return devDeviceStaticService.assign(deviceStaticVO);
//    }
//
//    /**
//     * 车辆分配客户
//     * 
//     * @return
//     */
//    @CrossOrigin
//    @ApiOperation(value = "车辆信息修改", notes = "车辆信息修改")
//    @RequestMapping(value = "/update")
//    public Result update(@Validated(value = Valid.update.class) VehicleInsertVO vehicle) {
//        DevDeviceStaticDO dsd = ConvertorUtils.deepConvert(vehicle, DevDeviceStaticDO.class);
//        devDeviceStaticService.update(dsd);
//        return Result.ok();
//    }
//
//    /**
//     * 车辆分配客户
//     * 
//     * @return
//     */
//    @CrossOrigin
//    @ApiOperation(value = "车辆删除", notes = "车辆删除")
//    @RequestMapping(value = "/delete")
//    public Result delete(@Validated(value = Valid.update.class) VehicleInsertVO vehicle) {
//        int i = devDeviceStaticService.deleteById(vehicle.getDevId());
//        if (i > 0) {
//            return Result.ok("删除成功");
//        }
//        return Result.error("删除失败");
//    }
//
//    /**
//     * 指令开门操作
//     * 
//     * @param
//     * @return
//     */
//    @CrossOrigin
//    @ApiOperation(value = "车辆开门", notes = "车辆开门")
//    @RequestMapping(value = "/openDoor")
//    public Object openDoor(Integer id) {
//        // JSONObject josn = JSONObject.parseObject(id);
//        DevDeviceStaticDO dsd = devDeviceStaticService.selectById(id);
//        Assert.isTrue(dsd != null, "车辆不存在");
//        DevDeviceOnlineDO dod = devDeviceOnlineService.selectOne(ImmutableMap.of("devId", dsd.getDevId()));
//        Assert.isTrue(dod != null, "车辆不存在");
//        LOG.info("dod: {}", JSON.toJSONString(dod));
//        if (Integer.valueOf(0).equals(dod.getDeviceStatus())) {
//            return Result.error("车辆已离线，无法开门/锁门");
//        }
//        if (dod.getDeviceStatus().equals(0)) {
//            return Result.error("车辆已离线，无法远程开门/锁门");
//        }
//        if (dod.getFire().equals(1)) {
//            return Result.error("车辆已启动，无法远程开门/锁门");
//        }
//
//        String upid = String.valueOf(((int) ((Math.random() * 9 + 1) * 100000)));
//        String command = "<C006," + dsd.getImei() + "," + upid + ",1002>";
//        String result = com.cenntro.oss.util.SocketUtil.GetInstance().SendMsg(command, dod.getIpPort());
//        if (result.equals("success")) {
//            // 插入一次操作记录
//            DevOperateDO model = new DevOperateDO();
//            model.setCommand(command);
//            model.setDevId(dsd.getDevId());
//            model.setInfo("开锁");
//            model.setUpIndex(upid);
//            model.setCity(dod.getCity());
//            model.setStatus("已发送到连接池");
//            model.setCreateTime(new Date());
//            devOperateService.insert(model);
//            return Result.ok();
//        }
//        return Result.error("操作开门失败");
//    }
//
//    /**
//     * 关门操作
//     * 
//     * @param
//     * @return
//     */
//    @RequestMapping("/closeDoor")
//    @CrossOrigin
//    @ApiOperation(value = "关门", notes = "关门")
//    public Object closeDoor(Integer id) {
//        Result result = Result.error("操作失败");
//        // JSONObject josn = JSONObject.parseObject(id);
//        DevDeviceStaticDO dsd = devDeviceStaticService.selectById(id);
//        Assert.isTrue(dsd != null, "车辆不存在");
//        DevDeviceOnlineDO dod = devDeviceOnlineService.selectOne(ImmutableMap.of("devId", dsd.getDevId()));
//        Assert.isTrue(dod != null, "车辆不存在");
//        LOG.info("dod: {}", JSON.toJSONString(dod));
//        if (Integer.valueOf(0).equals(dod.getDeviceStatus())) {
//            return Result.error("车辆已离线，无法锁车");
//        }
//        if (dod.getFire() != null && dod.getFire().equals(1)) {
//            return Result.error("车辆已启动，无法锁车");
//        }
//        if (dod.getDoor() != null && dod.getDoor().equals(2)) {
//            return Result.error("右门已开启，请确认门关闭后重试");
//        }
//        if (dod.getDoor() != null && dod.getDoor().equals(4)) {
//            return Result.error("左门已开启，请确认门关闭后重试");
//        }
//        if (dod.getDoor() != null && dod.getDoor().equals(0)) {
//            return Result.error("门已开启，请确认门关闭后重试");
//        }
//
//        String upid = String.valueOf(((int) ((Math.random() * 9 + 1) * 100000)));
//        String command = "<C006," + dsd.getImei() + "," + upid + ",1001>";
//        String resultText = com.cenntro.oss.util.SocketUtil.GetInstance().SendMsg(command, dod.getIpPort());
//        if (resultText.equals("success")) {
//            // 插入一次操作记录
//            DevOperateDO model = new DevOperateDO();
//            model.setCommand(command);
//            model.setDevId(dsd.getDevId());
//            model.setInfo("关锁");
//            model.setUpIndex(upid);
//            model.setCity(dod.getCity());
//            model.setStatus("已发送到连接池");
//            model.setCreateTime(new Date());
//            devOperateService.insert(model);
//            return Result.ok();
//        }
//        return result;
//    }
//
//
//    // /**
//    // * 车辆查询
//    // *
//    // * @return
//    // */
//
//    @CrossOrigin
//    @ApiOperation(value = "车辆查询", notes = "车辆管理")
//    @RequestMapping(value = "/list")
//    public Result list(DeviceListQO qo, PageVO pageVO) {
//        if(StaticEnum.DISTRIBUTION.getState().equals(qo.getState())||StaticEnum.NO_DISTRIBUTION.getState().equals(qo.getState())){
//            Page<DevDeviceStaticDO> page = PageHelper.startPage(pageVO.getPage(), pageVO.getLimit());
//            List<VehicleDetailVO> list = devDeviceStaticService.selectListByCarIdAndPlantIdAndBuildTimeAndDevSn(qo);
//            return PageResult.ok(list, page.getTotal());
//        }
//        return Result.error("状态值不对");
//    }
//
//    /**
//     * 新增库存车辆
//     * 
//     * @param
//     * @return
//     */
//    @ApiOperation(value = "新增车辆", notes = "车辆管理")
//    @RequestMapping("/add")
//    @CrossOrigin
//    public Object add(AddVehicleQO qo) {
//        if (StringUtils.isNoneBlank(qo.getColor(), qo.getDevSn(), qo.getGreenListNum(), qo.getImei(), qo.getTbox())) {
//            DevDeviceStaticDO ddsd = ConvertorUtils.deepConvert(qo, DevDeviceStaticDO.class);
//            int insert = devDeviceStaticService.insert(ddsd);
//            if (insert > 0) {
//                return Result.ok(insert);
//            }
//            return Result.error("未添加成功！");
//        }
//        return Result.error("参数错误");
//
//    }
//    
//    // ----------------------------------------------------------------------------------------------------------------------------------
//    /**
//     * 新的车辆想起， 提供给oss 后台车辆详情
//     * TODO
//     * @return
//     */
//    @CrossOrigin
//    @ApiOperation(value = "查询车辆最新详情", notes = "车辆管理")
//    @RequestMapping(value = "/selectNewDetail")
//    public Result selectNewDetail(Integer devId){
//        Assert.isTrue(devId != null, "车辆id 不能是空！");
//        //基本信息
//        VehicleVO vo = new VehicleVO();
//        vo.setId(devId);
//        Result result = this.selectDetail(vo);
//        if (Result.SUCCESS.equals(result.getState())){
//            VehicleDetailVO detail = (VehicleDetailVO)this.selectDetail(vo).getData();
//            //零部件
//            List<DevDevicePartsDO> devParts = devDevicePartsService.selectByMap(ImmutableMap.of("devId", detail.getDevId()));
//            DevBomPartpnRefDO ref = new DevBomPartpnRefDO();
//            ref.setBomId(detail.getBomId());
//            List<DevBomPartpnRefDO> refs = devBomPartpnRefService.selectPage(ref); //关系
//    
//            List<DevDevicePartsVO> parts = fixPartsnTree(ConvertorUtils.deepConvertList(devParts, DevDevicePartsVO.class), refs);
//            //合格证
//            DevCertificateDO devCerts = devCertificateService.selectOne(ImmutableMap.of("devId", detail.getDevId()));
//            //电池
//            DevBatteryPackDO pack = new DevBatteryPackDO();
//            pack.setDevId(detail.getDevId());
//            List<DevBatteryPackDO> devBatteryPackList = devBatteryPackMapper.selectPage(pack);
//            List<DevBatteryPackVO> packList = ConvertorUtils.deepConvertList(devBatteryPackList, DevBatteryPackVO.class);
//            for(DevBatteryPackVO packVO : packList){
//                DevBatteryModuleDO module = new DevBatteryModuleDO();
//                module.setDbpId(packVO.getDbpId());
//                List<DevBatteryModuleDO> devBatteryModulesList = devBatteryModuleService.selectPage(module);
//                List<DevBatteryModuleVO> modulesList = ConvertorUtils.deepConvertList(devBatteryModulesList, DevBatteryModuleVO.class);
//                packVO.setDevBatteryModuleVO(modulesList);
//                for (DevBatteryModuleVO moduleVO : modulesList){
//                    DevBatteryDO battery = new DevBatteryDO();
//                    battery.setDbmId(moduleVO.getDbmId());
//                    List<DevBatteryDO> DevBatteryDOList = devBatteryMapper.selectPage(battery);
//                    moduleVO.setDevBattery(ConvertorUtils.deepConvertList(DevBatteryDOList, DevBatteryVO.class));
//                }
//            }
//            NewVehicleDetailVO newDetail = ConvertorUtils.deepConvert(detail, NewVehicleDetailVO.class);
//            newDetail.setDevBatteryPack(packList);
//            //行驶证
//            DevDrivingInfoDO driving = devDrivingInfoService.selectOne(ImmutableMap.of("devId", detail.getDevId()));
//            newDetail.setDrivingInfo(ConvertorUtils.deepConvert(driving, DevDrivingInfoVO.class));
//            //维护记录
//            AfterFaultDO afterFault = new AfterFaultDO();
//            afterFault.setDevId(devId);
//            List<AfterFaultDO> faultList = afterFaultService.selectPage(afterFault);
//            List<AfterFaultVO> faultVOList = ConvertorUtils.deepConvertList(faultList, AfterFaultVO.class);
//            for (AfterFaultVO faultVO : faultVOList){
//                AfterFaultPartsDO faultPart = new AfterFaultPartsDO();
//                faultPart.setFaultId(faultVO.getFaultId());
//                List<AfterFaultPartsDO> list = afterFaultPartsService.selectPage(faultPart);
//                faultVO.setFaultPart(ConvertorUtils.deepConvertList(list, AfterFaultPartsVO.class));
//            }
//            newDetail.setAfterFault(faultVOList);
//            newDetail.setDevParts(parts);
//            devCerts = (devCerts == null) ? new DevCertificateDO() : devCerts;
//            newDetail.setDevCerts(ConvertorUtils.deepConvert(devCerts, DevCertificateVO.class));
//            return Result.ok(newDetail);
//        }
//        return Result.error("车辆不存在");
//        
//    }
//
//    /**
//     * 查询所有子料号
//     * 
//     * @param parentPartPN 父料号
//     * @param refs  关系
//     * @param devParts 所有料号
//     */
//    private void getchildren(DevDevicePartsVO parentPartPN, List<DevBomPartpnRefDO> refs, Map<String, DevDevicePartsVO> partMap){
//        Iterator<DevBomPartpnRefDO> it = refs.iterator();
//        while(it.hasNext()){
//            DevBomPartpnRefDO ref = it.next();
//            DevDevicePartsVO partPN = null;
//            if (StringUtils.isBlank(ref.getLevel())){
//                continue;
//            }
//            String[] mask = ref.getLevel().split("\\.");
//            if(ArrayUtils.indexOf(mask, parentPartPN.getPartsPn()) == ArrayUtils.getLength(mask) -1){
//                if (parentPartPN.getChild() == null){
//                    parentPartPN.setChild(Lists.newArrayList());
//                }
//                partPN = getDevDevicePartsVO(ref, partMap.get(ref.getPartsPn()));
//                parentPartPN.getChild().add(partPN);
//            }
//            if (partPN != null){
//                this.getchildren(partPN, refs, partMap);
//            }
//        }
//    }
//    
//    /**
//     * 
//     * @param devParts
//     * @param refs
//     * @return
//     */
//    private List<DevDevicePartsVO> fixPartsnTree(List<DevDevicePartsVO> devParts, List<DevBomPartpnRefDO> refs){
////      long st = System.currentTimeMillis();
//        final List<DevDevicePartsVO> children = Lists.newArrayList();
//        Map<String, DevDevicePartsVO> partMap = Maps.newHashMap();
//
//        for (DevDevicePartsVO part : devParts){
//            part.setPartsPn(part.getPartsPn());
//            partMap.put(part.getPartsPn(), part);
//        }
//        
//        for(int i = 0; i < refs.size(); i++){
//            DevBomPartpnRefDO ref = refs.get(i);
//            if (StringUtils.compare(ref.getLevel(), "0") == 0){
//                DevDevicePartsVO partPN = getDevDevicePartsVO(ref, partMap.get(ref.getPartsPn()));
//                DevDevicePartsVO vo = getDevDevicePartsVO(ref, partPN);
//                refs.remove(ref);
//                children.add(vo);
//                i--;
//            }
//        }
//        for(DevDevicePartsVO partVO : children){
//            getchildren(partVO, refs, partMap);
//        }
////      long end = System.currentTimeMillis();
////      System.out.println("cost" + (end - st));
//        return children;
//    }
//    
//    private DevDevicePartsVO getDevDevicePartsVO(DevBomPartpnRefDO ref, DevDevicePartsVO part){
//        if (part == null){
//            part = new DevDevicePartsVO();
//        }
//        part.setBomId(ref.getBomId());
//        part.setChild(Lists.newArrayList());
//        part.setPartsName(ref.getPartsName());
//        part.setPartsPn(ref.getPartsPn());
////      part.setPartsSn(ref.get);
//        part.setRefId(ref.getId());
//        return part;
//    }
//    
//}
//
//    
//    